Linq to SQL 其中两列都必须与列表匹配
Linq to SQL where both of the 2 columns must match from the list
上一个查询
var orderNameList = GetOrderNames().ToList();
var orderTypes = orderTypeRepository.Query().Where(x => orderNameList.Contains(x.Name)).ToList();
新查询(新要求 - 从列表中获取名称和地区匹配的订单类型)
var orderNameAndRegionList = document.OrderTypes
.Select(x=> new { x.Name, x.RegionCode}).ToList(); //Anonymous Order list {Name, RegionCode}
var orderTypes = orderTypeRepository.Query()
.Where(x => orderNameAndRegionList.Any(p => p.Name == x.Name && p.RegionCode == x.RegionCode))
.ToList()
这个新查询抛出 NHibernate 异常
System.NotSupportedException: : ( : p1 )
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
我正在尝试避免将查询放入这样的 foreach 循环中:
orderNameAndRegionList.ForEach(x =>
{
var orderType = orderTypeRepository.Query().SingleOrDefault(r => r.Name == x.Name && r.RegionCode == x.RegionCode);
orderTypes.Add(orderType);
});
是否有更好的解决方案来避免查询内循环?
了解 LINQ 的工作原理对您的情况很关键。如果 GetOrderNamesWithRegion returns 是 IQueryable<> 类型,您可以在第一个解决方案中简单地使用它。下面是一个愚蠢的例子,解释了什么时候会发生什么。
NHibernate 不支持您在 LINQ 查询中使用 List>,但应该允许使用 IQueryable。
using System;
using System.Linq;
namespace LINQExplanation
{
class Program
{
static void Main(string[] args)
{
string[] db = new string[] { "value 1", "value 2", "value 3" };
// Stage 1: My nonsense query but you get the picture
var query = db
.Where(v => v == "value 1")
.Where(v => v == "value 2")
.Where(v => v == "value 3");
query.Where(v => v == "Non existent");
// Until now nothing is read from the array;
// Stage 2: the .ToList() resolves the query and the array is read.
var result = query.ToList();
Console.ReadKey();
}
}
}
上一个查询
var orderNameList = GetOrderNames().ToList();
var orderTypes = orderTypeRepository.Query().Where(x => orderNameList.Contains(x.Name)).ToList();
新查询(新要求 - 从列表中获取名称和地区匹配的订单类型)
var orderNameAndRegionList = document.OrderTypes
.Select(x=> new { x.Name, x.RegionCode}).ToList(); //Anonymous Order list {Name, RegionCode}
var orderTypes = orderTypeRepository.Query()
.Where(x => orderNameAndRegionList.Any(p => p.Name == x.Name && p.RegionCode == x.RegionCode))
.ToList()
这个新查询抛出 NHibernate 异常
System.NotSupportedException: : ( : p1 )
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
我正在尝试避免将查询放入这样的 foreach 循环中:
orderNameAndRegionList.ForEach(x =>
{
var orderType = orderTypeRepository.Query().SingleOrDefault(r => r.Name == x.Name && r.RegionCode == x.RegionCode);
orderTypes.Add(orderType);
});
是否有更好的解决方案来避免查询内循环?
了解 LINQ 的工作原理对您的情况很关键。如果 GetOrderNamesWithRegion returns 是 IQueryable<> 类型,您可以在第一个解决方案中简单地使用它。下面是一个愚蠢的例子,解释了什么时候会发生什么。
NHibernate 不支持您在 LINQ 查询中使用 List
using System;
using System.Linq;
namespace LINQExplanation
{
class Program
{
static void Main(string[] args)
{
string[] db = new string[] { "value 1", "value 2", "value 3" };
// Stage 1: My nonsense query but you get the picture
var query = db
.Where(v => v == "value 1")
.Where(v => v == "value 2")
.Where(v => v == "value 3");
query.Where(v => v == "Non existent");
// Until now nothing is read from the array;
// Stage 2: the .ToList() resolves the query and the array is read.
var result = query.ToList();
Console.ReadKey();
}
}
}