c# - 从 LINQ to SQL 中提取 WHERE 子句

标签 c# sql linq

我正在与一位想要将 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/

相关文章:

c# - 如何在 LINQ 中插入占位符以便我的组恰好有 24 个点

c# - 在 C# LINQ 中实现 RANK OVER SQL 子句

c# - 在 NHibernate 上使用 Linq 的 IN 运算符

c# - 批量插入数据表到 MS Access (MS Excel) 数据库 (C#)

c# - 无法在我的 View 模型中访问对象的属性

c# - 选择随机节点并添加到标签

sql - 在 JSONB 字段上使用 Like 进行查询

c# - 通过 Xamarin.Forms 在 Android 上打印本地文件

java sql语法错误插入到

sql - 如何创建一个等于最后插入行的id的临时变量