标签: linq-expressions

将多个Include语句传递到存储库?

我试图找到一种方法将包含语句的集合传递到我的存储库,以便我可以让它包含特定的实体.以下是我的存储库中的一些示例代码.

   public TEntity GetById(Guid id)
        {
            return id != Guid.Empty ? GetSet().Find(id) : null;
        }
   private IDbSet<TEntity> GetSet()
            {
                return _unitOfWork.CreateSet<TEntity>();
            }
Run Code Online (Sandbox Code Playgroud)

GetByID方法调用GetSet以返回实体集.我在想,如果我能以某种方式传入一组实体来包含(通过表达式)作为我的GetById的一部分,这样我就不必将GetSet公开给我的服务了.所以,像这样:

var entity = _repository.GetById(theId,e => {e.Prop1,e.Prop2,e.Prop3});

然后我可以将该表达式传递给我的GetSet方法并将其传递给include语句.思考?

linq-expressions entity-framework-4.1

0
推荐指数
2
解决办法
5962
查看次数

如何将 Linq 表达式的片段存储在变量中并在查询中使用这些变量?

我有一个这样的表达:

List<BAL.Receipt> ac = BAL.ApplicationInfo.db.Receipts.Where
                (x => x.InvoiceNo.StartsWith(txtSearch.Text)
                 | x.Alias.StartsWith(txtSearch.Text)
Run Code Online (Sandbox Code Playgroud)

我想要做的是将此表达式拆分为多个部分并将它们存储在变量中

喜欢

var a = x => x.InvoiceNo.StartsWith(txtSearch.Text);
var b = x => x.Alias.StartsWIth (txtSearch.Text) ; 
Run Code Online (Sandbox Code Playgroud)

查询时

List<BAL.Receipt> ac = BAL.ApplicationInfo.db.Receipts.Where( a & b) ; 
Run Code Online (Sandbox Code Playgroud)

有可能实现这一目标吗?

如果可能,请给我举个例子。

.net c# linq linq-expressions

0
推荐指数
1
解决办法
2471
查看次数

未为类型“&lt;&gt;f__AnonymousType2`6 定义实例属性“party_id”

我为过滤器列构建了一种辅助方法。

public static class Helper
{
    public static IQueryable<T> FilterForColumn<T>(this IQueryable<T> queryable, string colName, string searchText)
    {
        if (colName != null && searchText != null)
        {
            var parameter = Expression.Parameter(typeof(T), "m");
            var propertyExpression = Expression.Property(parameter, colName);
            System.Linq.Expressions.ConstantExpression searchExpression = null;
            System.Reflection.MethodInfo containsMethod = null;
            // this must be of type Expression to accept different type of expressions
            // i.e. BinaryExpression, MethodCallExpression, ...
            System.Linq.Expressions.Expression body = null;
            Expression ex1 = null;
            Expression ex2 = null;
            Expression converted = null;
            switch (colName) …
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net linq-expressions

0
推荐指数
1
解决办法
5777
查看次数

将LINQ表达式作为参数传递给where子句

请在投票结束前仔细阅读该问题.这不是重复的.

我正在尝试构建一个泛型方法,返回类型为T的实体列表,这些实体连接到AuditLog类型的日志.这是我使用的LINQ中的LEFT JOIN解释

var result = from entity in entitySet
             from auditLog in auditLogSet.Where(joinExpression).DefaultIfEmpty()
             select new { entity, auditLog };
return result.GroupBy(item => item.entity)
                     .Select(group => new
                         {
                             Entity = group.Key,
                             Logs = group.Where(i => i.auditLog != null).Select(i => i.auditLog)
                         });
Run Code Online (Sandbox Code Playgroud)

问题出在joinExpression中.我想将它传递给WHERE子句,但它对于不同的具体类型T(它依赖于实体变量)是不同的,例如对于特定实体它可能是

joinExpression = l => l.TableName == "SomeTable" && l.EntityId == entity.SomeTableId;
Run Code Online (Sandbox Code Playgroud)

注意上面的entity.SomeTableId.这就是我无法在查询开始之前初始化joinExpression的原因.如果它实际上依赖于"entity"变量(它是查询本身的一部分),我如何将joinExpression作为参数传递?

.net c# linq entity-framework linq-expressions

0
推荐指数
1
解决办法
1万
查看次数

如何将Linq staement传递给另一种类型?

下面我有一个包装另一个方法的方法.我想要做的是提供一个可选参数来过滤内部方法,这是一种与T不同的类型.

这是被认为是"公共"API的外部方法:

public override IQueryable<T> GetEverything()
{
    return Get()
        .Where(i => i.Active == true)
        .Select(i => new T(i));
}
Run Code Online (Sandbox Code Playgroud)

作为伪代码,我想做这样的事情:

var items = GetEverything(x => x.SomeValue > 10);
Run Code Online (Sandbox Code Playgroud)

哪个会像这样传递给方法

   public override IQueryable<T> GetEverything(???)
    {
        return Get()
            .Where(i => i.Active == true)
            .Where(x => x.SomeValue > 10)
            .Select(i => new T(i));
    }
Run Code Online (Sandbox Code Playgroud)

注意我仍然想保留我的i.Active过滤器,如果开发者决定传入过滤器,我不想放松它.传入的过滤器将不会替换内部过滤器.有人能帮忙吗?任何帮助或建议将不胜感激!

.net c# linq linq-expressions

0
推荐指数
1
解决办法
77
查看次数

启用 RemoveRange 以通过实体上的谓词删除

在业务层中,删除与实体的关系时会出现大量重复代码,而实体本身正在被删除(没有对数据库进行级联删除的好处)。除了相关的实体删除用例之外,还可以使用一种好的方法来减少通过任何匹配谓词(例如通过 id 等)删除记录所需的代码。

// Simple example removing phone numbers from people entity
// The "personId" is an identifier passed into the method performing the deletion
var phones = _context.Phones
    .Where(m => m.PersonId == personId)
    .ToList();
if (phones.Count > 0)
    _context.Phones.RemoveRange(phones);
Run Code Online (Sandbox Code Playgroud)

我将此作为我想出的解决方案的问答发布,以便我以后可以查找。绝对希望看到其他方法。

c# linq entity-framework linq-expressions

0
推荐指数
1
解决办法
9159
查看次数

适当的LINQ表达式

我一直试图搜索谷歌但无济于事.感觉就像以前被问过,但也许我不是在谷歌搜索我认为我需要的东西.

我想要得到的集合Object是谁ICollection<T>Id财产是一个value.

我应该用哪种方式编写这个Linq表达式?

例如:

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class UserRole {
    public int UserId { get; set; }
    public int RoleId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我知道RoleId,我怎么得到所有User的?以下似乎是正确的,它确实给了我我需要的东西:

例1

var roleId = 1;
var users = db.UserRoles.SingleOrDefault(r => r.RoleId == roleId).Roles;
Run Code Online (Sandbox Code Playgroud)

但是,有可能反过来获得相同的结果吗?例如,我试过这个:

例2

var roleId …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda linq-expressions

0
推荐指数
1
解决办法
67
查看次数