我正在与一位想要将 LINQ to SQL 与其内部 DAL 混合使用的客户合作。最终他们希望能够使用典型的 LINQ 语法查询他们的层。棘手的一点是他们动态构建查询。所以最终我想要的是能够进行 LINQ 查询,将其拆开并能够检查各个部分以拉出正确的对象,但我真的不想构建一个部分来翻译“where”表达式进入 SQL。这是我可以使用 Microsoft 代码生成的东西吗?或者有更简单的方法吗?
最佳答案
(您的意思只是 LINQ,而不是真正的 LINQ-to-SQL)
当然,您可以做到 - 但这是大量的工作量。 Here's how ;我建议“不要”。您还可以查看 DbLinq 的源代码- 看看他们是如何做到的。
如果您只是想要Where
,这有点容易 - 但一旦你开始进行联接、分组等 - 这将非常很难做到。
这里只是Where
支持自定义 LINQ 实现(不是完全可查询的提供程序,但足以让 LINQ 与 Where
一起工作):
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
namespace YourLibrary
{
public static class MyLinq
{
public static IEnumerable<T> Where<T>(
this IMyDal<T> dal,
Expression<Func<T, bool>> predicate)
{
BinaryExpression be = predicate.Body as BinaryExpression;
var me = be.Left as MemberExpression;
if(me == null) throw new InvalidOperationException("don't be silly");
if(me.Expression != predicate.Parameters[0]) throw new InvalidOperationException("direct properties only, please!");
string member = me.Member.Name;
object value;
switch (be.Right.NodeType)
{
case ExpressionType.Constant:
value = ((ConstantExpression)be.Right).Value;
break;
case ExpressionType.MemberAccess:
var constMemberAccess = ((MemberExpression)be.Right);
var capture = ((ConstantExpression)constMemberAccess.Expression).Value;
switch (constMemberAccess.Member.MemberType)
{
case MemberTypes.Field:
value = ((FieldInfo)constMemberAccess.Member).GetValue(capture);
break;
case MemberTypes.Property:
value = ((PropertyInfo)constMemberAccess.Member).GetValue(capture, null);
break;
default:
throw new InvalidOperationException("simple captures only, please");
}
break;
default:
throw new InvalidOperationException("more complexity");
}
return dal.Find(member, value);
}
}
public interface IMyDal<T>
{
IEnumerable<T> Find(string member, object value);
}
}
namespace MyCode
{
using YourLibrary;
static class Program
{
class Customer {
public string Name { get; set; }
public int Id { get; set; }
}
class CustomerDal : IMyDal<Customer>
{
public IEnumerable<Customer> Find(string member, object value)
{
Console.WriteLine("Your code here: " + member + " = " + value);
return new Customer[0];
}
}
static void Main()
{
var dal = new CustomerDal();
var qry = from cust in dal
where cust.Name == "abc"
select cust;
int id = int.Parse("123");
var qry2 = from cust in dal
where cust.Id == id // capture
select cust;
}
}
}
关于c# - 从 LINQ to SQL 中提取 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1820857/