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();
        }
    }
}