ورود

View Full Version : Entity framework and Fulltext Search



spicirmkh
یک شنبه 14 اسفند 1390, 17:12 عصر
یک SP نوشته ام که کارش full text search انجام می دهد :




CREATE PROCEDURE [dbo].[usp_ad_Search]
@keyword nvarchar(4000)
AS
BEGIN
select * from tblStdA
where (CONTAINS(SSORT, @keyword) OR CONTAINS(PaperTITLE, @keyword))
end



اما توی Entity framework وقتی Import می کنم نمی تواند خروجی که همان مقدار دستور Select است را ایجاد و درست کند . چگونه اینکار انجام دهم
با تشکر

mehdi.mousavi
چهارشنبه 17 اسفند 1390, 11:55 صبح
سلام.
منظورتون چیه که نمیتونه؟ Get Column Information رو در Add Function Import میزنید، فیلدهای جدول tvlStdA رو بهتون درست برنمیگردونه؟
اگر اینطوره، احتمالا مشکل جای دیگه ای هستش. آیا query ی شما در Management Studio بدرستی اجرا میشه؟ آیا FTS و Catalog مربوطه
بدرستی فعال شده؟

من اینکارو قبلا آزمایش کرده ام و هیچ مشکلی با سناریوی فوق نداشته ام. اگر اطلاعات بیشتری بدید شاید بتونم کمکتون کنم.

موفق باشید.

spicirmkh
پنج شنبه 18 اسفند 1390, 08:43 صبح
با سلام
برنامه نوشته شده یعنی store procedure که شامل دستور (CONTAINS) که کار full text search انجام می دهد در Management Studio بدرستی کار می کند .

در Entity framework وقتی SP را Add function import انجام می دهیم Get column information می زنیم پیغام the selected stored procedure returns no columns می دهد
حتی در دستور SP نوشته ام select A=123 from tblStdA باز هم عمل نکرد
این link مشاهده بفرمایید
http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/74b43216-461a-4b68-87e0-c593123ac0f2

با تشکر

mehdi.mousavi
پنج شنبه 18 اسفند 1390, 15:39 عصر
سلام.
Entity Framework در (حداقل) دو حالت، توان import کردن SP ها رو نداره:


وقتی که SP از جداول موقت، Result Set خودش رو برگردونه.
Result Set مورد نظر رو بر اساس query ی dynamic ای برگردونه.

شما در این Stored Procedure کاری کرده اید که Metadata های مورد نظر EF به دستش نرسه! چرا؟ نمیدونم، چون هنوز نمیدونم tblStdA چی هستش، ممکنه View ای باشه که در اون از جداول موقت استفاده کرده اید و ... در هر حال، اطلاعات جامع در این خصوص (و 2 راه حل پیشنهادی) رو می تونید در این آدرس (http://stackoverflow.com/questions/7128747/ef4-the-selected-stored-procedure-returns-no-columns) مشاهده کنید.


موفق باشید.

spicirmkh
شنبه 20 اسفند 1390, 08:51 صبح
سلام

جدول tblStdA یک جدول معمولی است نه دینامیک نه View , ساختار آن


CREATE TABLE [dbo].[tblStdA](
[PaperID] [int] IDENTITY(1,1) NOT NULL,
[SSORT] [varchar](100) NULL,
[PaperTITLE] [nvarchar](500) NULL,
)



و SP ما


alter PROCEDURE [dbo].[usp_ad_Search]
@keyword nvarchar(4000)
AS
BEGIN
select PaperTITLE from tblStdA
where CONTAINS(PaperTITLE, @keyword)
END
SET FMTONLY ON



خود شما این موضو ع تست کنید می بینید باز جواب نمی دهد
با تشکر

mehdi.mousavi
یک شنبه 21 اسفند 1390, 13:16 عصر
سلام.
بله، جالبه. منم چند دقیقه تلاش کردم و هر کاری کردم Schema رو بر نگردوند. اما خوب، هنوز دو روش وجود داره:


بصورت دستی (یا با اعمال تغییر در فایل XML و یا از طریق پنجره Add Function Import) خروجی رو Entity ی مورد نظر Set کنید. در مثال شما، Entities رو روی tblStdA بذارید. بدین ترتیب، خروجی تابع شما، ObjectResult<tblStdA> خواهد بود که با ToList (بعنوان مثال) میتونید لیستی از tblStdA ها داشته باشید.
حقه بزنید، بدین شکل که SP ی خودتون رو بدین شکل تغییر بدید:

select * from tblStdA
where 1 = 1 OR CONTAINS(PaperTITLE, @keyword)

بدین ترتیب، Schema به EF برمیگرده و می تونید در صورت نیاز ComplexType مورد نظر رو ایجاد کنید. وقتی این کار انجام شد، حالا می تونید بخش 1=1 رو از SP ی خودتون حذف کنید و ادامه بدید...

موفق باشید.

spicirmkh
یک شنبه 21 اسفند 1390, 18:20 عصر
از روش دوم خیلی خوش ام خیلی جالب بود دستت درد نکند


سلام.
بله، جالبه. منم چند دقیقه تلاش کردم و هر کاری کردم Schema رو بر نگردوند. اما خوب، هنوز دو روش وجود داره:



بصورت دستی (یا با اعمال تغییر در فایل XML و یا از طریق پنجره Add Function Import) خروجی رو Entity ی مورد نظر Set کنید. در مثال شما، Entities رو روی tblStdA بذارید. بدین ترتیب، خروجی تابع شما، ObjectResult<tblStdA> خواهد بود که با ToList (بعنوان مثال) میتونید لیستی از tblStdA ها داشته باشید.
حقه بزنید، بدین شکل که SP ی خودتون رو بدین شکل تغییر بدید:


select * from tblStdA
where 1 = 1 OR CONTAINS(PaperTITLE, @keyword)

بدین ترتیب، Schema به EF برمیگرده و می تونید در صورت نیاز ComplexType مورد نظر رو ایجاد کنید. وقتی این کار انجام شد، حالا می تونید بخش 1=1 رو از SP ی خودتون حذف کنید و ادامه بدید...

موفق باشید.