我试图找到一种方法将包含语句的集合传递到我的存储库,以便我可以让它包含特定的实体.以下是我的存储库中的一些示例代码.
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语句.思考?
我有一个这样的表达:
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)
有可能实现这一目标吗?
如果可能,请给我举个例子。
我为过滤器列构建了一种辅助方法。
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) 请在投票结束前仔细阅读该问题.这不是重复的.
我正在尝试构建一个泛型方法,返回类型为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作为参数传递?
下面我有一个包装另一个方法的方法.我想要做的是提供一个可选参数来过滤内部方法,这是一种与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过滤器,如果开发者决定传入过滤器,我不想放松它.传入的过滤器将不会替换内部过滤器.有人能帮忙吗?任何帮助或建议将不胜感激!
在业务层中,删除与实体的关系时会出现大量重复代码,而实体本身正在被删除(没有对数据库进行级联删除的好处)。除了相关的实体删除用例之外,还可以使用一种好的方法来减少通过任何匹配谓词(例如通过 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)
我将此作为我想出的解决方案的问答发布,以便我以后可以查找。绝对希望看到其他方法。
我一直试图搜索谷歌但无济于事.感觉就像以前被问过,但也许我不是在谷歌搜索我认为我需要的东西.
我想要得到的集合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)