- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为我的实体编写一些通用的 LINQ 查询,但在执行更复杂的事情时遇到了问题。现在我正在使用一个 EntityDao 类,它具有我所有的泛型,我的每个对象类 Daos(例如 Accomplishments Dao)都继承了它,例如:
using LCFVB.ObjectsNS;
using LCFVB.EntityNS;
namespace AccomplishmentNS
{
public class AccomplishmentDao : EntityDao<Accomplishment>{}
}
现在我的 entityDao 有如下代码:
using LCFVB.ObjectsNS;
using LCFVB.LinqDataContextNS;
namespace EntityNS
{
public abstract class EntityDao<ImplementationType> where ImplementationType : Entity
{
public ImplementationType getOneByValueOfProperty(string getProperty, object getValue)
{
ImplementationType entity = null;
if (getProperty != null && getValue != null) {
//Nhibernate Example:
//ImplementationType entity = default(ImplementationType);
//entity = Me.session.CreateCriteria(Of ImplementationType)().Add(Expression.Eq(getProperty, getValue)).UniqueResult(Of InterfaceType)()
LCFDataContext lcfdatacontext = new LCFDataContext();
//Generic LINQ Query Here
lcfdatacontext.GetTable<ImplementationType>();
lcfdatacontext.SubmitChanges();
lcfdatacontext.Dispose();
}
return entity;
}
public bool insertRow(ImplementationType entity)
{
if (entity != null) {
//Nhibernate Example:
//Me.session.Save(entity, entity.Id)
//Me.session.Flush()
LCFDataContext lcfdatacontext = new LCFDataContext();
//Generic LINQ Query Here
lcfdatacontext.GetTable<ImplementationType>().InsertOnSubmit(entity);
lcfdatacontext.SubmitChanges();
lcfdatacontext.Dispose();
return true;
}
else {
return false;
}
}
}
}
我已经让 insertRow 函数正常工作,但是我什至不确定如何去做 getOnebyValueOfProperty,我在这个网站上能找到的最接近的东西是:
如何使用我当前的设置传递列名和我正在检查的值?从该链接看来,这是不可能的,因为使用了 where 谓词,因为在我将它们传入之前,实体类不知道任何属性是什么。
最后,我需要一些方法来将新对象设置为返回类型设置为实现类型,在 nhibernate 中(我试图从中转换)只是这一行:
ImplentationType entity = default(ImplentationType);
但是默认是 nhibernate 命令,我该如何为 LINQ 执行此操作?
编辑:
getOne 似乎不工作,即使只是离开基类(这是自动生成的 LINQ 类的部分类)。我什至删除了泛型。我试过:
namespace ObjectsNS
{
public partial class Accomplishment
{
public Accomplishment getOneByWhereClause(Expression<Action<Accomplishment, bool>> singleOrDefaultClause)
{
Accomplishment entity = new Accomplishment();
if (singleOrDefaultClause != null) {
LCFDataContext lcfdatacontext = new LCFDataContext();
//Generic LINQ Query Here
entity = lcfdatacontext.Accomplishments.SingleOrDefault(singleOrDefaultClause);
lcfdatacontext.Dispose();
}
return entity;
}
}
}
得到如下错误:
Error 1 Overload resolution failed because no accessible 'SingleOrDefault' can be called with these arguments:
Extension method 'Public Function SingleOrDefault(predicate As System.Linq.Expressions.Expression(Of System.Func(Of Accomplishment, Boolean))) As Accomplishment' defined in 'System.Linq.Queryable': Value of type 'System.Action(Of System.Func(Of LCFVB.ObjectsNS.Accomplishment, Boolean))' cannot be converted to 'System.Linq.Expressions.Expression(Of System.Func(Of LCFVB.ObjectsNS.Accomplishment, Boolean))'.
Extension method 'Public Function SingleOrDefault(predicate As System.Func(Of Accomplishment, Boolean)) As Accomplishment' defined in 'System.Linq.Enumerable': Value of type 'System.Action(Of System.Func(Of LCFVB.ObjectsNS.Accomplishment, Boolean))' cannot be converted to 'System.Func(Of LCFVB.ObjectsNS.Accomplishment, Boolean)'. 14 LCF
好的没问题我改了:
public Accomplishment getOneByWhereClause(Expression<Action<Accomplishment, bool>> singleOrDefaultClause)
到:
public Accomplishment getOneByWhereClause(Expression<Func<Accomplishment, bool>> singleOrDefaultClause)
错误消失了。好的,但是现在当我尝试通过以下方式调用该方法时:
Accomplishment accomplishment = new Accomplishment();
var result = accomplishment.getOneByWhereClause(x=>x.Id = 4)
它不起作用,它说 x 未声明。
我也试过
getOne<Accomplishment>
Expression<Func<
Expression<Action<
有多种格式,但要么参数没有被正确识别为函数调用中的表达式,要么无法将我作为参数的类型转换为在 singleofDefault() 中使用的类型。所以这两个错误就像上面一样。而且类(class)成绩确实有ID。最后,我还尝试将 x 声明为一项新成就,这样它就会被声明,此时代码会自动将 => 更改为 >= 并说:
Error 1 Operator '>=' is not defined for types 'LCFVB.ObjectsNS.Accomplishment' and 'Integer'.
=(
最佳答案
如果我明白你想要什么,你链接到的问题描述了(某种程度上)你需要做什么。
public ImplementationType getOne(Expression<Func<ImplementationType , bool> singleOrDefaultClause)
{
ImplementationType entity = null;
if (singleOrDefaultClause != null)
{
LCFDataContext lcfdatacontext = new LCFDataContext();
//Generic LINQ Query Here
entity = lcfdatacontext.GetTable<ImplementationType>().SingleOrDefault(singleOrDefaultClause);
lcfdatacontext.Dispose();
}
return entity;
}
当你调用这个方法时,它看起来像
//note assumption that ConcreteClass DAO has member called Id
var myEntity = ConcreteClass.getOne(x=>x.Id == myIdVariable);
我还没有编译它,所以我不能说它 100% 正确,但这个想法是可行的。我正在使用类似的东西,除了我将我的方法定义为具有基类的通用方法来实现公共(public)代码。
更新你不能只使用 new 来创建你需要的类的实例吗?如果您需要更通用的东西,那么我认为您将不得不使用反射来调用构造函数。对不起,如果我误解了你的问题。
更新以响应更多详细信息的评论更新 POCO 的扩展:有很多方法可以做到这一点,但一种方法是从表达式中获取 PropertyInfo 并调用 setter。 (可能有更好的方法来做到这一点,但我还没有想出一个。)例如它可能看起来像:
protected internal bool Update<TRet>(Expression<Func<T, TRet>> property, TRet updatedValue)
{
var property = ((MemberExpression)member.Body).Member as PropertyInfo;
if (property != null)
{
property.SetValue(this, updatedValue, null);
return true;
}
return false;
}
注意:我从我正在工作的项目的代码库中提取了这个(删除了一些其他东西)。此方法是我所有 POCO 实现的基类的一部分。 Editable 基类和我的 POCO 的基类在同一个程序集中,因此 Editable 可以将其作为内部方法调用。
I got my methods working but I like yours more because it is more flexible allowing for multiple parameters, but I really really want to keep this in my DAO. It would be kind of confusing to have all db methods in my DAO except one. Would setting the function to be getOne work?
我不太确定我明白你在问我什么。是的,您可以将 getOne
函数设置为通用方法,这实际上是我所做的,尽管我更进一步并且所有方法都是通用的。这简化了我的 UI/BL 界面边界,到目前为止,至少在表现力/灵 active 上足以涵盖我所有的使用需求,而无需进行重大更改。如果有帮助,我已经包含了由 BL 对象实现并向 UI 公开的接口(interface)。我的 DAL 本质上是 NHibernate,所以我没有什么可以向您展示的。
public interface ISession : IDisposable
{
bool CanCreate<T>() where T : class,IModel;
bool CanDelete<T>() where T : class, IModel;
bool CanEdit<T>() where T : class, IModel;
bool CanGet<T>() where T : class, IModel;
T Create<T>(IEditable<T> newObject) where T:class,IModel;
bool Delete<T>(Expression<Func<T, bool>> selectionExpression) where T : class, IModel;
PageData<T> Get<T>(int page, int numberItemsPerPage, Expression<Func<T, bool>> whereExpression) where T : class, IModel;
PageData<T> Get<T, TKey>(int page, int numberItemsPerPage, Expression<Func<T, bool>> whereExpression, Expression<Func<T, TKey>> orderBy, bool isAscending) where T : class, IModel;
T Get<T>(Expression<Func<T, bool>> selectionExpression) where T : class, IModel;
IEnumerable<T> GetAllMatches<T>(Expression<Func<T, bool>> whereExpression) where T : class, IModel;
IEditable<T> GetForEdit<T>(Expression<Func<T, bool>> selectionExpression) where T : class, IModel;
IEditable<T> GetInstance<T>() where T : class, IModel;
IQueryable<T> Query<T>() where T : class, IModel;
bool Update<T>(IEditable<T> updatedObject) where T : class, IModel;
}
关于c# - 具有继承基类的 LINQ 通用查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595862/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!